﻿Imports PTIC_GestionBDD
Imports PTIC_Util
Imports Actuariat
Imports System.Data
Imports OMANE.Common.Model.Interfaces
Imports System.Collections.Specialized
Imports OMANE.Common.Model.Parametrage

''' <summary>
''' Modèle de l'outil taux garantis
''' </summary>
''' <remarks></remarks>
<Serializable()> Public Class ModelTauxGarantis
    Implements IModelTauxGarantis

    Public Sub New(ByVal ModeleOMANE As IModelOMANE)

        m_ModelOMANE = ModeleOMANE

        m_ListeTraitementsTxGarantis = New ListeTraitementsTxGar(
            m_ModelOMANE.ListeTraitements,
            Me.ListeParametres,
            Me.Referentiel)

        initTraitementsParametres()

        m_segmentation = New Segmentation(m_ListeTraitementsTxGarantis.TraitTbleEncoursPrep1,
                                          m_ListeTraitementsTxGarantis.TraitReqSegmentation,
                                          ListeParametres)

        'Configurer les liens entre les traitements et les paramètres
        numMethodeCalculEnCours = 1

        AddHandler m_segmentation.Retenue.CollectionChanged, AddressOf onSegmentationRetenue_hasChanged
        AddHandler ListeParametres.Table_Mortalite_F.hasChanged, AddressOf onParametreTable_Mortalite_F_hasChanged
        AddHandler ListeParametres.Table_Mortalite_H.hasChanged, AddressOf onParametreTable_Mortalite_H_hasChanged
        AddHandler ListeParametres.GrilleTarifaire.hasChanged, AddressOf onParametreTableGrilleTarifaire_haschanged

    End Sub

    ''' <summary>
    ''' Lorsque la segmentation retenue change, le niveau de granularité de la table en entrée des moteurs
    ''' de calcul est modifiée. Le traitement d'extraction de la segmentation est également modifié par l'objet Segmentation
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub onSegmentationRetenue_hasChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
        'Lorsque la segmentation retenue change, il faut mettre à jour le traitement en entrée des
        'moteurs de calcul du taux garanti

        If e.Action = NotifyCollectionChangedAction.Add Then
            'Dim segEtude As ObservableDictionary(Of String, Correspondance) = m_segmentation.Retenue

            For Each NewItem As Object In e.NewItems

                Dim NewCorresp As Correspondance = CType(NewItem, KeyValuePair(Of String, Correspondance)).Value

                With m_ListeTraitementsTxGarantis
                    .TraitEntreeModelesTxGar.addSELECT(.TraitTbleTravail.nom, NewCorresp.description)
                    .TraitEntreeModelesTxGar.addGROUPBY(.TraitTbleTravail.nom, NewCorresp.description)
                End With
            Next

        End If

        If e.Action = NotifyCollectionChangedAction.Remove Then

            For Each NewItem As Object In e.OldItems

                Dim NewCorresp As Correspondance = CType(NewItem, KeyValuePair(Of String, Correspondance)).Value

                With m_ListeTraitementsTxGarantis
                    .TraitEntreeModelesTxGar.removeSELECT(NewCorresp.description)
                    .TraitEntreeModelesTxGar.removeGROUPBY(NewCorresp.description)
                End With
            Next

        End If

    End Sub
    Private Sub onParametreTable_Mortalite_F_hasChanged(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("Le nom de la table de mortalité des femmes a changé")
        ListeTraitements.TraitTbleMortF.FichierBDD.NomComplet = csteEmplacementReferentiel & ListeParametres.Table_Mortalite_F.ValeurUnique
    End Sub
    Private Sub onParametreTable_Mortalite_H_hasChanged(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("Le nom de la table de mortalité des hommes a changé")
        ListeTraitements.TraitTbleMortH.FichierBDD.NomComplet = csteEmplacementReferentiel & ListeParametres.Table_Mortalite_H.ValeurUnique
    End Sub
    Private Sub onParametreTableGrilleTarifaire_haschanged(ByVal sender As Object, ByVal e As EventArgs)
        ListeTraitements.TraitGrilleTarifaire.FichierBDD.NomComplet = csteEmplacementReferentiel & ListeParametres.GrilleTarifaire.ValeurUnique
        ListeTraitements.init_JointureTableTravGrilleTarif()
    End Sub
    Private Sub onParametreTableMaintienINCINVM2_hasChanged(ByVal sender As Object, ByVal e As EventArgs)
        ListeTraitements.TraitMaintienINCINVM2.FichierBDD.NomComplet = csteEmplacementReferentiel & ListeParametres.Tble_maintienINCINVM2.ValeurUnique
    End Sub

    Public Sub Reset() Implements IModelTauxGarantis.Reset
        m_ModelOMANE.Reset()
        ListeParametres.Reset()
        For Each corresp As Correspondance In ListeTraitements.TraitTbleEncours.ListeChampsSortie.Values
            corresp.setChEntree(Nothing)
        Next

        Dim correspTranchesAges As ChampsTraitTranche = ListeTraitements.TraitTbleEncoursPrep1.ListeChampsSortie.Item(desctrAge)
        If correspTranchesAges.isAttachedToTraitement = False Then
            correspTranchesAges.isAttachedToTraitement = True
            correspTranchesAges.TraitementExtractionTable.FichierBDD.NomComplet = csteEmplacementReferentiel & "trAgeDefaut.sas7bdat"
            correspTranchesAges.TraitementExtractionTable.FichierBDD.GenererNomCompletChanged()
        Else
            correspTranchesAges.TraitementExtractionTable.FichierBDD.NomComplet = csteEmplacementReferentiel & "trAgeDefaut.sas7bdat"
        End If

        Dim correspTranchesCapi As ChampsTraitTranche = ListeTraitements.TraitTbleEncoursPrep1.ListeChampsSortie.Item("Tranche de capitaux")
        If correspTranchesCapi.isAttachedToTraitement = False Then
            correspTranchesCapi.isAttachedToTraitement = True
            correspTranchesCapi.TraitementExtractionTable.FichierBDD.NomComplet = csteEmplacementReferentiel & "trCapiDefaut.sas7bdat"
            correspTranchesCapi.TraitementExtractionTable.FichierBDD.GenererNomCompletChanged()
        Else
            correspTranchesCapi.TraitementExtractionTable.FichierBDD.NomComplet = csteEmplacementReferentiel & "trCapiDefaut.sas7bdat"
        End If

        ListeTraitements.TraitTbleEncours.FichierBDD.NomComplet = ""

        'Reset de la base d'enccours
        'Dim a As String = "Test"

        'Voir tous les traitements qu'il est utile de réinitialiser


        'listeTraitements.Clear()

        'Reset de la liste des tables du référentiel

    End Sub

#Region "Liste des traitements utilisés dans le taux garanti"
    Private m_ListeTraitementsTxGarantis As IListeTraitementsTxGar
    Public Overloads ReadOnly Property ListeTraitements As IListeTraitementsTxGar Implements IModelTauxGarantis.ListeTraitements
        Get
            Return m_ListeTraitementsTxGarantis
        End Get
    End Property
#End Region

#Region "Segmentation"
    Private m_segmentation As Segmentation
    ''' <summary>
    ''' Objet gérant les variables de segmentation de l'étude
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Segmentation() As Segmentation Implements IModelTauxGarantis.Segmentation
        Get
            Return m_segmentation
        End Get
        Set(ByVal value As Segmentation)
            m_segmentation = value
        End Set
    End Property
#End Region

#Region "Liste des paramètres"
    Protected _listeParametres As ParametresList
    ''' <summary>
    ''' Liste des paramètres de l'étude
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    ''' 
    Public ReadOnly Property ListeParametres() As ParametresList Implements IModelTauxGarantis.ListeParametres
        Get
            If _listeParametres Is Nothing Then
                _listeParametres = New ParametresList(Me.Referentiel.InfoTables)
            End If
            Return _listeParametres
        End Get
    End Property

    ''' <summary>
    ''' Initialisation des requêtes associées aux paramètres pouvant être segmentés
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub initTraitementsParametres()
        With ListeParametres
            .Pres_GarantiePTIA.Requete = ListeTraitements.TraitReqSegmentationParam(nomPres_GarantiePTIA)
            .Tx_PrixGarantiePTIA.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_PrixGarantiePTIA)
            .Tx_Majo_sinDCPTIA.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_Majo_sinDCPTIA)
            .Sel_medic.Requete = ListeTraitements.TraitReqSegmentationParam(nomSel_medic)
            .Tx_abat_MalaNonObje.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_abat_MalaNonObje)
            .Tx_abat_ExclPerteRev.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_abat_ExclPerteRev)
            .Tx_MajoPrudSinINCINV.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_MajoPrudSinINCINV)
            .Tx_chgtSecuINCINV.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_chgtSecuINCINV)
            .Tx_mensEntreeINCINV.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_mensEntreeINCINV)
            .Age_FinDC.Requete = ListeTraitements.TraitReqSegmentationParam(nomAge_FinDC)
            .Age_FinINCINV.Requete = ListeTraitements.TraitReqSegmentationParam(nomAge_FinINCINV)
            .Tx_CommiContA.Requete = ListeTraitements.TraitReqSegmentationParam(nomTx_CommiContA)

            .Duree_Actu.Requete = ListeTraitements.TraitReqSegmentationParamSens(nomDuree_Actu)
            .Duree_Actu.Etat = ParamEtat.Computed
            .TxNom_Actu.Requete = ListeTraitements.TraitReqSegmentationParamSens(nomTxNom_Actu)
            .TxNom_Actu.Etat = ParamEtat.Computed
            .TxMort_Actu.Requete = ListeTraitements.TraitReqSegmentationParamSens(nomTxMort_Actu)
            .TxMort_Actu.Etat = ParamEtat.Computed

            'Ajouter les traitements aux tables de paramétrage
        End With
    End Sub
#End Region

#Region "Numéro de la méthode de calcul retenue"
    Protected _numMethodeCalculEnCours As Integer
    ''' <summary>
    ''' Numéro de la méthode de calcul du taux garanti en cours
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property numMethodeCalculEnCours() As Integer Implements IModelTauxGarantis.numMethodeCalculEnCours
        Get
            Return _numMethodeCalculEnCours
        End Get
        Set(ByVal value As Integer)
            _numMethodeCalculEnCours = value
            RaiseEvent NumMethodeCalculChanged(Me, New EventArgs)
        End Set
    End Property
    Public Event NumMethodeCalculChanged As EventHandler Implements IModelTauxGarantis.NumMethodeCalculChanged
#End Region

#Region "IUniversOMANE"
    Private m_ModelOMANE As IModelOMANE
    Public Sub Initialize() Implements Common.IService.Initialize
        m_ModelOMANE.Initialize()
    End Sub
    Public ReadOnly Property Connection As PTIC_GestionBDD.IConnection Implements IModelOMANE.Connection
        Get
            Return m_ModelOMANE.Connection
        End Get
    End Property
    Public ReadOnly Property DataSet As System.Data.DataSet Implements IModelOMANE.DataSet
        Get
            Return m_ModelOMANE.DataSet
        End Get
    End Property
    Public ReadOnly Property ListeTraitementsModelOMANE As ListeTraitementsBase(Of String) Implements IModelOMANE.ListeTraitements
        Get
            Return m_ModelOMANE.ListeTraitements
        End Get
    End Property
    Public Sub ResetModelOMANE() Implements IModelOMANE.Reset
        Me.Reset()
    End Sub
    Public ReadOnly Property Referentiel As Common.Model.Interfaces.IReferentielOMANE Implements Common.Model.Interfaces.IModelOMANE.Referentiel
        Get
            Return m_ModelOMANE.Referentiel
        End Get
    End Property

#Region "IDisposable Support"
    Private disposedValue As Boolean ' Pour détecter les appels redondants

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: supprimez l'état managé (objets managés).
            End If

            ' TODO: libérez les ressources non managées (objets non managés) et substituez la méthode Finalize() ci-dessous.
            ' TODO: définissez les champs volumineux à null.
        End If
        Me.disposedValue = True
    End Sub

    ' TODO: substituez Finalize() uniquement si Dispose(ByVal disposing As Boolean) ci-dessus comporte du code permettant de libérer des ressources non managées.
    'Protected Overrides Sub Finalize()
    '    ' Ne modifiez pas ce code. Ajoutez du code de nettoyage dans Dispose(ByVal disposing As Boolean) ci-dessus.
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' Ce code a été ajouté par Visual Basic pour permettre l'implémentation correcte du modèle pouvant être supprimé.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Ne modifiez pas ce code. Ajoutez du code de nettoyage dans Dispose(ByVal disposing As Boolean) ci-dessus.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region
#End Region

End Class